package com.edu.exam.entity.grading.audit;

import com.edu.exam.enums.grading.ConfigCategory;
import com.edu.exam.enums.grading.ConfigEnvironment;
import com.edu.exam.enums.grading.ConfigType;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import java.time.LocalDateTime;

/**
 * 成绩审核配置实体类
 *
 * <p>成绩审核配置实体用于管理审核系统的配置参数，包含
 * 系统配置、业务规则、流程设置、参数管理等。确保审核系统的灵活性和可配置性。</p>
 *
 * <p>所属模块：B-06 成绩管理模块</p>
 * <p>对应数据库表：grade_audit_config</p>
 *
 * <p>核心功能：
 * - 配置管理：管理系统的各种配置参数
 * - 业务规则：定义审核的业务规则和约束
 * - 流程设置：配置审核流程的相关设置
 * - 参数管理：管理可变的系统参数
 * - 版本控制：支持配置的版本管理和变更追踪</p>
 *
 * @author 系统生成
 * @version 1.0
 * @since 2025-11-10
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@Entity
public class GradeAuditConfig {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 配置键
     *
     * <p>配置的唯一键标识符。</p>
     */
    @Column(name = "config_key", nullable = false, length = 100, unique = true)
    private String configKey;

    /**
     * 配置值
     *
     * <p>配置的值。</p>
     */
    @Column(name = "config_value", columnDefinition = "TEXT")
    private String configValue;

    /**
     * 配置类型
     *
     * <p>配置的数据类型。
     * 支持的类型：STRING（字符串）、INTEGER（整数）、BOOLEAN（布尔）、DOUBLE（小数）、JSON（JSON对象）、ARRAY（数组）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "config_type", nullable = false, length = 20)
    private ConfigType configType = ConfigType.STRING;

    /**
     * 默认值
     *
     * <p>配置的默认值。</p>
     */
    @Column(name = "default_value", columnDefinition = "TEXT")
    private String defaultValue;

    /**
     * 配置名称
     *
     * <p>配置的显示名称。</p>
     */
    @Column(name = "config_name", nullable = false, length = 200)
    private String configName;

    /**
     * 配置描述
     *
     * <p>配置的详细描述。</p>
     */
    @Column(name = "description", columnDefinition = "TEXT")
    private String description;

    /**
     * 配置分类
     *
     * <p>配置的分类。
     * 支持的分类：SYSTEM（系统配置）、WORKFLOW（工作流配置）、PERMISSION（权限配置）、NOTIFICATION（通知配置）、SECURITY（安全配置）、BUSINESS（业务配置）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "category", nullable = false, length = 20)
    private ConfigCategory category = ConfigCategory.SYSTEM;

    /**
     * 配置组
     *
     * <p>配置所属的组。</p>
     */
    @Column(name = "config_group", length = 100)
    private String configGroup;

    /**
     * 是否启用
     *
     * <p>配置是否启用。</p>
     */
    @Column(name = "is_enabled", nullable = false)
    private Boolean isEnabled = true;

    /**
     * 是否必需
     *
     * <p>配置是否为必需项。</p>
     */
    @Column(name = "is_required", nullable = false)
    private Boolean isRequired = false;

    /**
     * 是否可修改
     *
     * <p>配置是否可以被修改。</p>
     */
    @Column(name = "is_modifiable", nullable = false)
    private Boolean isModifiable = true;

    /**
     * 是否敏感
     *
     * <p>配置是否为敏感信息。</p>
     */
    @Column(name = "is_sensitive", nullable = false)
    private Boolean isSensitive = false;

    /**
     * 验证规则
     *
     * <p>配置值的验证规则，JSON格式存储。</p>
     */
    @Column(name = "validation_rules", columnDefinition = "TEXT")
    private String validationRules;

    /**
     * 取值范围
     *
     * <p>配置值的取值范围，JSON格式存储。</p>
     */
    @Column(name = "value_range", columnDefinition = "TEXT")
    private String valueRange;

    /**
     * 配置选项
     *
     * <p>配置的可选值，JSON格式存储。</p>
     */
    @Column(name = "config_options", columnDefinition = "TEXT")
    private String configOptions;

    /**
     * 配置环境
     *
     * <p>配置适用的环境。
     * 支持的环境：ALL（全部环境）、DEVELOPMENT（开发环境）、TESTING（测试环境）、STAGING（预发环境）、PRODUCTION（生产环境）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "environment", length = 20)
    private ConfigEnvironment environment = ConfigEnvironment.ALL;

    /**
     * 配置版本
     *
     * <p>配置的版本号。</p>
     */
    @Column(name = "config_version", length = 20)
    private String configVersion = "1.0";

    /**
     * 配置优先级
     *
     * <p>配置的优先级，数值越小优先级越高。</p>
     */
    @Column(name = "priority")
    private Integer priority = 0;

    /**
     * 缓存时间
     *
     * <p>配置的缓存时间（秒）。</p>
     */
    @Column(name = "cache_duration")
    private Integer cacheDuration = 300;

    /**
     * 依赖配置
     *
     * <p>此配置依赖的其他配置，JSON格式存储。</p>
     */
    @Column(name = "dependent_configs", columnDefinition = "TEXT")
    private String dependentConfigs;

    /**
     * 影响范围
     *
     * <p>配置变更的影响范围，JSON格式存储。</p>
     */
    @Column(name = "impact_scope", columnDefinition = "TEXT")
    private String impactScope;

    /**
     * 变更通知
     *
     * <p>配置变更时是否发送通知。</p>
     */
    @Column(name = "change_notification", nullable = false)
    private Boolean changeNotification = false;

    /**
     * 配置标签
     *
     * <p>JSON格式的配置标签，用于分类和过滤。</p>
     */
    @Column(name = "config_tags", columnDefinition = "TEXT")
    private String configTags;

    /**
     * 配置备注
     *
     * <p>配置的备注信息。</p>
     */
    @Column(name = "config_notes", columnDefinition = "TEXT")
    private String configNotes;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreationTimestamp
    @Column(name = "create_time", nullable = false, updatable = false)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @UpdateTimestamp
    @Column(name = "update_time", nullable = false)
    private LocalDateTime updateTime;

    /**
     * 创建用户ID
     */
    @Column(name = "create_user_id", length = 50)
    private String createUserId;

    /**
     * 更新用户ID
     */
    @Column(name = "update_user_id", length = 50)
    private String updateUserId;

    /**
     * 版本号（乐观锁）
     */
    @Version
    @Column(name = "version")
    private Integer version = 0;

    /**
     * 逻辑删除标记
     */
    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted = false;
}